package com.mashuai.utils.toolkit.core.msDataSource;

import com.mashuai.utils.config.constants.StaticConstant;
import com.mashuai.utils.toolkit.achieve.MsExegesis;
import com.mashuai.utils.toolkit.core.msDataSource.dto.MsDataSourceMsgDto;
import com.mashuai.utils.toolkit.core.msDataSource.functions.MsDSYouSql;
import com.mashuai.utils.toolkit.core.msDataSource.register.MsRegisterDataSource;
import com.mashuai.utils.toolkit.core.msDataSource.register.MsSwitchDataSource;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;

/**
 * @ClassName: MsDataSourceUtils
 * @Description: 数据源工具类
 */
@MsExegesis("数据源工具类")
public class MsDataSourceUtils {

    /**
     * 添加一个新数据源
     **/
    private static void addDataSource(String key, MsDataSourceMsgDto dto, boolean setDefDataSources) {
        MsRegisterDataSource.addDataSources(key, dto, setDefDataSources);
    }

    /**
     * 切换到指定数据源，需要用户传入本次执行的sql。目的是为了便于在执行sql结束后，直接清空当前数数据源信息
     **/
    @MsExegesis("切换到指定数据源，需要用户传入本次执行的sql。目的是为了便于在执行sql结束后，直接清空当前数数据源信息")
    public static <T> T switchDataSource(String key, String url, String userName, String password, MsDSYouSql<T> fuc) {
        MsDataSourceMsgDto dbDto = new MsDataSourceMsgDto(url, userName, password);
        addDataSource(key, dbDto, false);
        MsSwitchDataSource.setDataSource(key);
        T execute = fuc.execute();
        MsSwitchDataSource.clearDataSource();
        return execute;
    }

    /**
     * 把某个数据源替换成默认的数据源信息
     */
    @MsExegesis("把某个数据源替换成默认的数据源信息")
    public static void setDefDataSource(String url, String userName, String password) {
        MsDataSourceMsgDto dbDto = new MsDataSourceMsgDto(url, userName, password);
        addDataSource(StaticConstant.DB_DEFAULT_SOURCE_DATA_NAME, dbDto, true);
    }

    /**
     * 获取一个数据源
     **/
    @MsExegesis("获取一个数据源")
    public static DataSource getDataSource(String key) {
        return MsRegisterDataSource.getDataSource(key);
    }

    /**
     * 获取某个数据源的jdbc模板
     **/
    @MsExegesis("获取某个数据源的jdbc模板")
    public static JdbcTemplate getJdbcTemplate(String key) {
        return new JdbcTemplate(getDataSource(key));
    }

    /****
     * 移除一个数据源
     */
    @MsExegesis("移除一个数据源")
    public static void removeDataSource(String key) {
        MsRegisterDataSource.removeDataSources(key);
    }


}


